package com.dyna.cp.elasticsearch.service;

import com.dyna.cp.elasticsearch.domain.entity.Dyna;
import com.dyna.cp.elasticsearch.domain.param.DynaParam;
import com.dyna.domain.resp.PageResult;
import com.dyna.resp.GroupResp;

import java.util.List;
import java.util.Map;

/**
 * @author zhoucaiwnag
 */
public interface DynaEsService {

    /**
     * 查询所有索引
     * @return 索引数组
     */
    List<String> getIndices();

    /**
     * 添加索引
     * @param index 索引
     * @return result
     */
    Boolean addIndex(String index);

    /**
     * 删除索引
     * @param index 被删除的索引
     * @return result
     */
    Boolean delIndex(String index);

    /**
     * 索引是否存在
     * @param index 索引
     * @return result
     */
    Boolean isExist(String index);

    /**
     * 添加dyna索引数据
     * @param index 索引
     * @param dyna 数据
     * @return 添加的数据id
     */
    String addData(String index, Map<String, Object> dyna);

    /**
     * 批量添加
     * @param data 数据
     * @param index 索引
     * @return 批量添加结果
     */
    Boolean addBatchData(String index,List<Dyna> data);

    /**
     * 查询所有数据
     * @param index 索引
     * @return 全部数据
     */
    PageResult<?> queryDataAll(String index);

    /**
     * 分页查询所有数据
     * @param index 索引
     * @param dynaParam 查询条件
     * @return 数据
     */
    PageResult<?> queryDataPage(String index, DynaParam dynaParam);

    /**
     * 根据id查询详细信息
     * @param index 索引
     * @param id 主键id
     * @return 详细信息
     */
    Object queryDataById(String index, String id);

    /**
     * 修改数据
     * @param id 被修改数据的es id
     * @param index 索引
     * @param dyna 修改数据
     * @return 修改结果
     */
    Boolean updateData(String index,String id,Dyna dyna);

    /**
     * 删除数据
     * @param index 索引
     * @param id 被删除数据的es id
     * @return Boolean
     */
    Boolean deleteData(String index,String id);

    /**
     * 分组统计
     * @param index 索引
     * @param field 字段
     * @param type 类型
     * @return List<Map<String, Object>>
     */
    List<Map<String, Object>> group(String index, String field,String type);

    /**
     * 查询最大值和最小值
     * @param index 索引
     * @param field 统计字段
     * @param type 最大值或最小值
     * @return 值
     */
    Double getScoreStats(String index, String field, Boolean type);

    /**
     * 统计分组中数量、最大值和最小值
     * @param index index
     * @param groupField groupField
     * @param staticField staticField
     * @param type true最大值，false最小值
     * @param sort 排序
     * @return List<GroupResp>
     */
    List<GroupResp> getGroupStats(String index, String groupField, String staticField, Boolean type, String sort);

    /**
     * 查询网关请求日志
     * @param traceId traceId
     * @return 日志
     */
    Map<String, Object> getGatewayLogByTraceId(String traceId);

}
